package com.tinfeng.oop;

public class JavaFunction {
    /**
     * Java中定义方法
     * 访问修饰符 返回类型 方法名(参数列表) {
     *     若干语句;
     *     return 方法返回值;
     * }
     * 访问修饰符有4种情况 : public, private, protected,也可省略(default)
     * 返回类型 : 可以使任何的数据类型void，如果方法没有返回值，那类型设置为void
     * 方法名 : 方法名的命名规范和变量相同
     * 参数列表 : 参数是变量的一种类型。参数变量的作用域在方法内部
     * 方法体 : 方法内部的一些语句。当方法返回值为void时。可省略return
     *
     * 分类
     * 根据方法是否带有参数、是否有返回值。可分为4类
     * 无参无返回值方法，无参带返回值方法，带参数无返回值方法，带参数带返回值方法
     */

     // 无参无返回值方法
     public void printText() {
         System.out.println("123");
         System.out.println("1234");
         System.out.println("12345");
     }
     // 无参数带返回值
    public String getHelloStr() {
         String str = "rnm";
         // System.out.println(str);
         return str;
    }
    // 带参数无返回值
    public void printArea(float a, float b){    // 此处的a,b 为参数变量
         float recult = a * b;
        System.out.println("长方形" + recult);
    }
    // 带参数带返回值
    public int getSumOfSquares(int n) {
         int sum = 0;
        for (int i = 1; i <=n ; i++) {
            // 求i的平方，并加和赋值给sum
            sum += i*i;
        }
        return sum;
    }
    // 比较数组大小
    public boolean biJiaoArray(int[] arr,int elemenet) {
         // 定义返回结果，默认为false，即未找到element元素
        boolean result = false;
        for (int value: arr) {
            if (value == elemenet){
                // 找到了就改为true
                result = true;
                break;
            }
        }
        return result;
    }
    // 基本类型的方法传值
    public void speenUp(int speed){
        System.out.println("加速前为" + speed);
        speed ++;
        System.out.println("加速后为" + speed);
    }
    // 引用类型的传值
    public void replaceFirstPlayer(String[] players,String playName){
        System.out.println("替换球员");
        players[0] = playName;
    }
    // 可变参数
    public void sum(int... n){
         int sum = 0;
        for (int i:
             n) {
            sum +=i;
        }
        System.out.println(sum);
    }

    // 也可将数组传递给可变参数列表
    public void search (int element, int... elements) {
         boolean existed = false;
        for (int e :
             elements) {
            if (e == element) {
                existed = true;
                break;
            }
        }
        if (existed) {
            System.out.println("找到元素" + element);
        }else {
            System.out.println("未找到元素" +element);
        }
    }

    public static void main(String[] args) {
        // 调用方法先要实例化类
        JavaFunction javaFunction = new JavaFunction();
        javaFunction.printText();

        String result = javaFunction.getHelloStr();  // 由于调用的方法getHelloStr中只是返回一个变量，没有打印，所以不能直接调用方法，需要先实例化成对象后，打印出来
        System.out.println(result);

        javaFunction.printArea(1.2f,3.4f); // 调用printArea方法需要传入a，b两个参数 float类型后需跟f

        int sumOfSquares = javaFunction.getSumOfSquares(5);
        System.out.println(sumOfSquares);

        int[] array = {1, 3, 5, 6, 7, 9};
        int element= 10;
        boolean biJiaoArray = javaFunction.biJiaoArray(array,element);
        if (biJiaoArray){
            System.out.println("包含");
        } else {
            System.out.println("不包含");
        }

        // 基本类型的方法传值
        int speed = 10;
        javaFunction.speenUp(speed);
        System.out.println("调用方法后对原值不改变,还是" +speed);

        // 引用类型的传值
        String[] players = {"詹步思","科比","杜兰特","罗斯"};
        System.out.println("现有球员为");
        for (String player:players) {
            System.out.println(player+"\t");
        }

        javaFunction.replaceFirstPlayer(players,"乔布死");
        System.out.println("替换后的球员为");
        for (String player:players) {
            System.out.print(player+"\t");
        }

        // 可变参数
        javaFunction.sum(1,3,4,5);

        // 也可将数组传递给可变参数列表
        javaFunction.search(2,1,3,4,2);
        int[] arr = {1,2,3,4};
        javaFunction.search(3,arr);

        // 方法重载
        // 自定义方法重载
        // 判断一个方法是否是重载方法的原则：方法名相同，参数类型或参数个数不同。
        /*
        public void study() {
            System.out.println("同学真好学!");
        }

        public void study(String name) {
            System.out.println(name + "同学真好学!");
        }

        public void study(String name, int age) {
            System.out.println(name + "同学真好学!" + "他今年" + age + "岁了");
        }
         以上均是方法重载

         下面这个不是
         public String study() { 这个定义了String返回值，其他都是空
            return "学习Java语言";
        }
         */
    }
}
